iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0

為甚麼需要架構呢? 簡單來說就是將我們放在一個MainActivity中,超級複雜的一推程式碼進行做分類處理,讓之後自己或他人比較輕鬆去閱讀程式碼。

雖然我標題只有MVP架構,但基本上有3種架構種類,但我只會大概提一下其他兩個架構。

後面會做一下MVP架構的範例。


架構種類

  1. MVC

    M=> Model,主要管理資料來源,如:SharedPreferences
    V=> UI,就是View,如:Activity、Fragment
    C=> Controller,介於View及Model之間的管道

  2. MVP
    M=> Model,主要管理資料來源,如:SharedPreferences
    V=> UI,就是View,如:Activity、Fragment
    P=> Presenter,View及Model之間的管道,負責邏輯處理

  3. MVVM

    M=> Model,主要管理資料來源,如:SharedPreferences
    V=> UI,就是View,如:Activity、Fragment
    (比較困難)

有大致了解後,我們就來上手做,這樣比較清楚,用簡單一點的登入畫面。

實作範例

我們除了原本的MainActivity外,需要再新增兩個Class和一個Interface。

  • 自己的com.example.(名稱)右鍵>New>點擊Java Class
    https://ithelp.ithome.com.tw/upload/images/20240921/20168454gQydNyIBDn.png
    https://ithelp.ithome.com.tw/upload/images/20240921/20168454B0yyNRtT8v.png

  • 命名完,且都新增完會長這樣
    https://ithelp.ithome.com.tw/upload/images/20240921/20168454dznU6l0N7K.png

  • MainActivity介面
    https://ithelp.ithome.com.tw/upload/images/20240921/20168454dxo7LvNi4a.png

  • SettingActivity介面
    https://ithelp.ithome.com.tw/upload/images/20240921/20168454nzDsv9lmJe.png

  • MainActivity

//在MainActivity先拿取登入資料
//在後面加入implements
public class MainActivity extends AppCompatActivity implements MainContract.view{

    private EditText accontEditText;
    private EditText passwordEditText;
    private Button sendoutButton;
    private Context context=this;
    private MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        accontEditText = findViewById(R.id.main_accont_et);
        passwordEditText = findViewById(R.id.main_password_et);
        sendoutButton = findViewById(R.id.main_sendout_btn);

        //New出Presenter,並把自己丟入。
        mainPresenter =new MainPresenter(this);

        sendoutButton.setOnClickListener(new View.OnClickListener() {
            @Override
            //當按下送出按鈕,拿取password和account給presente
            public void onClick(View view) {
                mainPresenter.getLoginData(passwordEditText.getText().toString(),accontEditText.getText().toString());
            }
        });
    }

    //當presente判斷帳密輸入錯誤,呼叫此方法。
    @Override
    public void loginError(){
        Toast.makeText(context,"帳密錯誤",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void showUserName(String userName){
        Toast.makeText(context,"歡迎登入"+userName,Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(MainActivity.this, SettingActivity.class);
        //指定名稱字串,可用標籤取得資料
        intent.putExtra("NAME",userName);//將bmi放進Intent
        startActivity(intent);//將intent 發送到Android,判別後顯示到SA畫面中
    }
}
  • SettingActivity
public class SettingActivity extends AppCompatActivity {
    private TextView msgTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_setting);

        msgTextView = findViewById(R.id.setting_msg_tv);

        //呼叫Activity,取得intent
        Intent intent = getIntent();
        String Name = intent.getStringExtra("NAME");
        //get型態Extra 取得資料(資料標籤)

        msgTextView.setText("歡迎登入\n"+Name);
    }
}
  • MainPresenter
//在Presenter做帳密判斷
public class MainPresenter implements MainContract.presenter{

    private MainContract.view callBack;
    private String userName;
    private MainModle modle;

    public MainPresenter(MainContract.view view){
        //接收View。
        this.callBack =view;
        //New出Modle,並把自己丟入。
        modle=new MainModle(this);
    }

    //如果帳密正確,到Modle拿取登入著資料,之後傳回給Presenter,最後再傳回給View顯示
    @Override
    public void getLoginData(String password, String account) {
        //登入正確,
        if(password.equals("123456")&&account.equals("neva")) {
            //到Modle拿取登入人員資料。
            userName = modle.getUserName();
            //再傳回view,叫view更新畫面。
            callBack.showUserName(userName);
        }
        //登入錯誤。
        else
            callBack.loginError();
    }
}
  • MainModle
public class MainModle implements MainContract.modle{
    private MainContract.presenter callBack;

    public MainModle(MainContract.presenter presenter) {
        //接收presenter
        this.callBack =presenter;
    }

    //回傳登入人員資料
    @Override
    public String getUserName() {
        return "neva";
    }
}
  • MainContract
//在 interface MainContract 是用來讓Presenter,View,Modle互相溝通
//並在 interface Contract新增三個interface,並新增他們的方法

public interface MainContract {
    interface view{
        void loginError();
        void showUserName(String userName);
    }

    interface presenter{
        void getLoginData(String password, String account);
    }

    interface modle{
        String getUserName();
    }
}

輸入帳密

https://ithelp.ithome.com.tw/upload/images/20240921/201684544dVO65iutd.png

帳密正確

https://ithelp.ithome.com.tw/upload/images/20240921/20168454yFos5c7rbi.png

帳密錯誤

https://ithelp.ithome.com.tw/upload/images/20240921/20168454UUhFBZVosD.png


上一篇
Toast浮動顯示 Day12
下一篇
元件篇-seekBar與客製化seekBar Day14
系列文
Android 元件總動員 - 運用與實踐元件指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言